package com.ano.controller;


import com.ano.utils.ResultUtil;
import org.apache.commons.io.FilenameUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 该类处理文件的请求
 */
@Controller
@RequestMapping("file")
public class FlieController {


    /**
     * ./files/username/userimg.xxx
     * 上传文件
     * 此操作只是将文件传入服务器本地，并不存入数据库，存入数据库操作在对应的user、cluster实现
     * 前端的src是固定的resource/static/files/username/filename.xxx
     * @param username   用户名
     * @param fileType   文件的类型{userimg,cluimg,note}
     * @return
     */
    @CrossOrigin
    @PostMapping("upload")
    @ResponseBody
    public ResultUtil<String> upload(@RequestParam(value = "username",defaultValue = "default") String username,
                                     @RequestParam(value = "clustername",defaultValue = "") String clustername,
                                     @RequestParam(value = "fileType",defaultValue = "default") String fileType,
                                     HttpServletRequest req) throws IOException {
        ResultUtil<String> res = new ResultUtil<String>();
        MultipartFile mf = null;

        //获取resources/static/files的绝对路径
        //getPath开头会有一个/，虽然没影响，但还是去除吧
        String absPath = ResourceUtils.getURL("classpath:").getPath().replaceFirst("/","")+"static/files";
        //每个用户有自己的文件目录
        String dirPath = absPath+"/"+username;
        //要返回前端的路径，相对路径
        File userDir = new File(dirPath);
        //如果不存在就创建一个目录
        if(!userDir.exists()){
            userDir.mkdirs();
        }
        String fileName = "";
        /**
         * 正式对文件进行处理
         */
        /**
         * 第一层t c看能否将MultipartFile类型取出
         * 如果能，就按照MultipartFile处理
         *
         */
        try {
            try {
                //手动获取MultipartFile
                MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
                mf = mreq.getFile("file");
                //如果获取成功
                //获取文件后缀
                String extension = "."+FilenameUtils.getExtension(mf.getOriginalFilename());
                //首先先把文件写好,如果与簇无关则就为这个名字
                fileName = fileType+extension;
                //如果是与簇相关的
                if(!"".equals(clustername)){
                    //与簇有关，加上簇相关信息
                    System.out.println("与簇有关！！！");
                    fileName = clustername+fileName;
                }
                mf.transferTo(new File(userDir,fileName));
            } catch (Exception e) {
                //不为MultipartFile
                //说明传入的是string，则获取其值，手动创建File
                String text = req.getParameter("file");
                fileName = fileType +".txt";
                if(!"".equals(clustername)){
                    //与簇有关，加上簇相关信息
                    System.out.println("与簇有关！！！");
                    fileName = clustername+fileName;
                }
                //创建filewriter写入文件
                FileWriter fw = new FileWriter(dirPath+"/"+fileName);
                fw.write(text);
                fw.flush();
                fw.close();
            }
            System.out.println(dirPath+"/"+fileName);
            //返回的相对路径
            res.setMsg("文件上传成功！！！").setObj("/files/"+username+"/"+fileName);
        } catch (IOException e) {
            e.printStackTrace();
            res.setMsg("文件上传失败！！！").setState(false);
        }

        return res;
        /*try {
            *//**
             * 先判断MultipartFile是否为空
             *//*
            if(mf==null||mf.isEmpty()){
                //如果为空，说明传入的是string，则获取其值，手动创建File
                String text = req.getParameter("file");
                fileName = fileType +".txt";
                if(!"".equals(clustername)){
                    //与簇有关，加上簇相关信息
                    fileName = clustername+fileName;
                }
                //创建filewriter
                FileWriter fw = new FileWriter(dirPath+"/"+fileName);
                fw.write(text);
                fw.flush();
                fw.close();
            }else {
                //获取文件后缀
                String extension = "."+FilenameUtils.getExtension(mf.getOriginalFilename());
                //首先先把文件写好,如果与簇无关则就为这个名字
                fileName = fileType+extension;
                //如果是与簇相关的
                if(!"".equals(clustername)){
                    //与簇有关，加上簇相关信息
                    fileName = clustername+fileName;
                }
                mf.transferTo(new File(userDir,fileName));
            }
            System.out.println(dirPath+"/"+fileName);
            //向前端返回路径
            res.setMsg("文件上传成功！！！").setObj(dirPath+"/"+fileName);
        } catch (Exception e) {
            e.printStackTrace();
            res.setMsg("文件上传失败！！！").setState(false);
        }*/

    }
}
